home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / tutorials / custEducation / opengl2 / lib / rgbReadImageFile.c < prev    next >
C/C++ Source or Header  |  1996-11-11  |  8KB  |  254 lines

  1. /*
  2.  * Copyright 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <unistd.h>
  18.  
  19. #include <GL/gl.h>
  20. #include <gl/image.h>
  21. #include "rgbImageFile.h"
  22.  
  23. /*
  24.  *    private function prototypes
  25.  *
  26.  */
  27.  
  28. void bwtorgba( register unsigned short *b, register unsigned int *l, 
  29.     register int n, float alpha );
  30. void rgbtorgba( register unsigned short *r, register unsigned short *g, 
  31.     register unsigned short *b, register unsigned int *l, 
  32.     register int n, float alpha );
  33. void rgbtorgba( register unsigned short *r, register unsigned short *g, 
  34.     register unsigned short *b, register unsigned int *l, 
  35.     register int n, float alpha );
  36. void rgbatorgba( register unsigned short *r, register unsigned short *g, 
  37.     register unsigned short *b, register unsigned short *a, 
  38.     register unsigned int *l, register int n, float alpha );
  39.  
  40. GLuint *rgbReadImageFile( char *name, GLint *width, GLint *height )
  41. {
  42.     unsigned int *base, *lptr;
  43.     unsigned short *rbuf, *gbuf, *bbuf, *abuf;
  44.     IMAGE *image;
  45.     int y;
  46.  
  47.     /* This program and librgbImageFile both rely on an unsigned
  48.      * int being 4 unsigned contiguous bytes.  The following test 
  49.      * checks to see if this is the case. 
  50.      */
  51.     if ( sizeof( unsigned int ) != 4  )
  52.     {
  53.         fprintf (stderr, "Warning: sizeof( unsigned int ) != 4,\
  54.             this program and librgbImageFile must be modified\n"
  55.             );
  56.  
  57.         exit (1);
  58.     }
  59.  
  60.     image = iopen(name,"r");
  61.     if(!image) {
  62.     fprintf(stderr,"rgbImageFileRead: can't open image file %s\n",name);
  63.     exit(1);
  64.     }
  65.     *width = image->xsize;
  66.     *height = image->ysize;
  67.     base = (unsigned int *)malloc(image->xsize*image->ysize*sizeof(unsigned int));
  68.     rbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  69.     gbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  70.     bbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  71.     abuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  72.     if(!base || !rbuf || !gbuf || !bbuf) {
  73.     fprintf(stderr,"rgbImageFileRead: can't malloc enough memory\n");
  74.     exit(1);
  75.     }
  76.     lptr = base;
  77.     for(y=0; y<image->ysize; y++) {
  78.     if(image->zsize>=4) {
  79.         getrow(image,rbuf,y,0);
  80.         getrow(image,gbuf,y,1);
  81.         getrow(image,bbuf,y,2);
  82.         getrow(image,abuf,y,3);
  83.         rgbatorgba(rbuf,gbuf,bbuf,abuf,lptr,image->xsize, 1.0);
  84.         lptr += image->xsize;
  85.     } else if(image->zsize==3) {
  86.         getrow(image,rbuf,y,0);
  87.         getrow(image,gbuf,y,1);
  88.         getrow(image,bbuf,y,2);
  89.         rgbtorgba(rbuf,gbuf,bbuf,lptr,image->xsize, 1.0);
  90.         lptr += image->xsize;
  91.     } else {
  92.         getrow(image,rbuf,y,0);
  93.         bwtorgba(rbuf,lptr,image->xsize, 1.0);
  94.         lptr += image->xsize;
  95.     }
  96.     }
  97.     iclose(image);
  98.     free(rbuf);
  99.     free(gbuf);
  100.     free(bbuf);
  101.     free(abuf);
  102.     return base;
  103. }
  104.  
  105. GLuint *rgbReadImageFileAlpha( char *name, GLint *width, GLint *height,
  106.                 GLfloat alpha)
  107. {
  108.     unsigned int *base, *lptr;
  109.     unsigned short *rbuf, *gbuf, *bbuf, *abuf;
  110.     IMAGE *image;
  111.     int y;
  112.  
  113.     /* This program and librgbImageFile both rely on an unsigned
  114.      * int being 4 unsigned contiguous bytes.  The following test 
  115.      * checks to see if this is the case. 
  116.      */
  117.     if ( sizeof( unsigned int ) != 4  )
  118.     {
  119.         fprintf (stderr, "Warning: sizeof( unsigned int ) != 4,\
  120.             this program and librgbImageFile must be modified\n"
  121.             );
  122.  
  123.         exit (1);
  124.     }
  125.  
  126.     image = iopen(name,"r");
  127.     if(!image) {
  128.     fprintf(stderr,"rgbImageFileRead: can't open image file %s\n",name);
  129.     exit(1);
  130.     }
  131.     *width = image->xsize;
  132.     *height = image->ysize;
  133.     base = (unsigned int *)malloc(image->xsize*image->ysize*sizeof(unsigned int));
  134.     rbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  135.     gbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  136.     bbuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  137.     abuf = (unsigned short *)malloc(image->xsize*sizeof(short));
  138.     if(!base || !rbuf || !gbuf || !bbuf) {
  139.     fprintf(stderr,"rgbImageFileRead: can't malloc enough memory\n");
  140.     exit(1);
  141.     }
  142.     lptr = base;
  143.     for(y=0; y<image->ysize; y++) {
  144.     if(image->zsize>=4) {
  145.         getrow(image,rbuf,y,0);
  146.         getrow(image,gbuf,y,1);
  147.         getrow(image,bbuf,y,2);
  148.         getrow(image,abuf,y,3);
  149.         rgbatorgba(rbuf,gbuf,bbuf,abuf,lptr,image->xsize, alpha);
  150.         lptr += image->xsize;
  151.     } else if(image->zsize==3) {
  152.         getrow(image,rbuf,y,0);
  153.         getrow(image,gbuf,y,1);
  154.         getrow(image,bbuf,y,2);
  155.         rgbtorgba(rbuf,gbuf,bbuf,lptr,image->xsize, alpha);
  156.         lptr += image->xsize;
  157.     } else {
  158.         getrow(image,rbuf,y,0);
  159.         bwtorgba(rbuf,lptr,image->xsize, alpha);
  160.         lptr += image->xsize;
  161.     }
  162.     }
  163.     iclose(image);
  164.     free(rbuf);
  165.     free(gbuf);
  166.     free(bbuf);
  167.     free(abuf);
  168.     return base;
  169. }
  170.  
  171. void
  172. bwtorgba( register unsigned short *b, register unsigned int *l, 
  173.     register int n, float alpha )
  174. {
  175.     register unsigned short scaledAlpha;
  176.  
  177.     scaledAlpha = (unsigned short) (alpha * 0xFF);
  178.     /* added FF for alpha so transparent textures will work - mars */
  179.     while(n>=8) {
  180.     l[0] = scaledAlpha | 0x01010100*b[0];
  181.     l[1] = scaledAlpha | 0x01010100*b[1];
  182.     l[2] = scaledAlpha | 0x01010100*b[2];
  183.     l[3] = scaledAlpha | 0x01010100*b[3];
  184.     l[4] = scaledAlpha | 0x01010100*b[4];
  185.     l[5] = scaledAlpha | 0x01010100*b[5];
  186.     l[6] = scaledAlpha | 0x01010100*b[6];
  187.     l[7] = scaledAlpha | 0x01010100*b[7];
  188.     l += 8;
  189.     b += 8;
  190.     n -= 8;
  191.     }
  192.     while(n--) 
  193.     *l++ = scaledAlpha | 0x01010100*(*b++);
  194. }
  195.  
  196. void
  197. rgbtorgba( register unsigned short *r, register unsigned short *g, 
  198.     register unsigned short *b, register unsigned int *l, 
  199.     register int n, float alpha)
  200. {
  201.     register unsigned short scaledAlpha;
  202.  
  203.     scaledAlpha = (unsigned short) (alpha * 0xFF);
  204.  
  205.     /* added FF for alpha so transparent textures will work - mars */
  206.     while(n>=8) {
  207.     l[0] = scaledAlpha | (b[0]<<8) | (g[0]<<16) | (r[0]<<24);
  208.     l[1] = scaledAlpha | (b[1]<<8) | (g[1]<<16) | (r[1]<<24);
  209.     l[2] = scaledAlpha | (b[2]<<8) | (g[2]<<16) | (r[2]<<24);
  210.     l[3] = scaledAlpha | (b[3]<<8) | (g[3]<<16) | (r[3]<<24);
  211.     l[4] = scaledAlpha | (b[4]<<8) | (g[4]<<16) | (r[4]<<24);
  212.     l[5] = scaledAlpha | (b[5]<<8) | (g[5]<<16) | (r[5]<<24);
  213.     l[6] = scaledAlpha | (b[6]<<8) | (g[6]<<16) | (r[6]<<24);
  214.     l[7] = scaledAlpha | (b[7]<<8) | (g[7]<<16) | (r[7]<<24);
  215.     l += 8;
  216.     r += 8;
  217.     g += 8;
  218.     b += 8;
  219.     n -= 8;
  220.     }
  221.     while(n--) 
  222.         *l++ = scaledAlpha | ((*b++)<<8) | ((*g++)<<16) | ((*r++)<<24);
  223. }
  224.  
  225. void
  226. rgbatorgba( register unsigned short *r, register unsigned short *g, 
  227.     register unsigned short *b, register unsigned short *a, 
  228.     register unsigned int *l, register int n , float alpha)
  229. {
  230.     register unsigned short scaledAlpha;
  231.  
  232.     scaledAlpha =  (alpha * 0xFF);
  233.  
  234.     while(n>=8) {
  235.     l[0] = (unsigned short)(alpha * a[0]) | (b[0]<<8) | (g[0]<<16) | (r[0]<<24);
  236.     l[1] = (unsigned short)(alpha * a[1]) | (b[1]<<8) | (g[1]<<16) | (r[1]<<24);
  237.     l[2] = (unsigned short)(alpha * a[2]) | (b[2]<<8) | (g[2]<<16) | (r[2]<<24);
  238.     l[3] = (unsigned short)(alpha * a[3]) | (b[3]<<8) | (g[3]<<16) | (r[3]<<24);
  239.     l[4] = (unsigned short)(alpha * a[4]) | (b[4]<<8) | (g[4]<<16) | (r[4]<<24);
  240.     l[5] = (unsigned short)(alpha * a[5]) | (b[5]<<8) | (g[5]<<16) | (r[5]<<24);
  241.     l[6] = (unsigned short)(alpha * a[6]) | (b[6]<<8) | (g[6]<<16) | (r[6]<<24);
  242.     l[7] = (unsigned short)(alpha * a[7]) | (b[7]<<8) | (g[7]<<16) | (r[7]<<24);
  243.     l += 8;
  244.     r += 8;
  245.     g += 8;
  246.     b += 8;
  247.     a += 8;
  248.     n -= 8;
  249.     }
  250.     while(n--) 
  251.         *l++ = ((unsigned short)(alpha * (*a++))) | ((*b++)<<8) | ((*g++)<<16) | ((*r++)<<24);
  252. }
  253.  
  254.